package cn.edu.neu.lab603.des

/** 带有一个指标的监视器。
  *
  * @tparam V 指标的类型
  */
trait SimMetric[@specialized(Int, Long, Double) +V] {

  /** 获取当前的监控数值。 */
  def getCurrentValue: V

  /** 当前值作为 toString 的返回值。 */
  override def toString: String = getCurrentValue.toString
}

object SimMetric {

  /** 把 SimMonitor 转化为 SimMetric 进行处理。
    *
    * @param monitor 监视器实例
    * @param vf      转化函数
    * @tparam S 监视器类（或其他类似类型）
    * @tparam V 值类型
    * @return SimMetric
    */
  def apply[S, V](monitor: S)(vf: S => V) = new SimMetric[V] {
    /** 获取当前的监控数值。 */
    @inline override def getCurrentValue: V = vf(monitor)
  }

  /** 通过转化函数 vf 直接得出指标数值。
    *
    * @param vf 转化函数
    * @tparam V 类型
    * @return SimMetric
    */
  def apply[V](vf: () => V) = new SimMetric[V] {
    /** 获取当前的监控数值。 */
    @inline override def getCurrentValue: V = vf()
  }
}